package com.offcn;

import java.awt.*;
import java.util.Scanner;

/**
 * @Date 2021-7/25 7"34
 * @Auther yhw
 * 游戏规则：五子棋，只需要每个玩家将自己的棋子连成五个，那么就可以获胜
 *
 * 代码：采用的是递归的方式，这个案例对理解递归有很好的帮助，如果你还有意见，可以评论。
 */

public class App {
    static Scanner ins=new Scanner(System.in);
    //玩家一的棋子样式和玩家二的棋子样式
    static final String Image1=" * ";
    static final String Image2= " - ";
    //几行几列, 棋盘都是矩阵【2*2，5*5】
    static int Rows=2;
    static int Lows=2;
    //棋盘的总数；
    static int qipanCount=Rows*Lows;

    static int winCount=5;//一般的五子棋是5个就赢了，这里可以修改几个的时候才能赢。

    public static void main(String[] args) {
        /**
         * 五子棋：
         */
            String[][] qipan=new String[Rows][Lows];
            init(qipan);
            begin(qipan,1);
    }

    /**
     *
     * @param qipan  当前棋盘
     */
    public static void begin(String[][] qipan,int x){
        //继续请玩家输入行和列
        System.out.println("请玩家 "+ x +" 输入行和列");
        Integer row=ins.nextInt();
        Integer n=ins.nextInt();
        if((row*n)>=(Rows*Lows)){
            System.out.println("输入的行和列已经超出了棋盘的大小了,请重新输入~~~~");
            showQiPan(qipan);
            begin(qipan,x);
            return;
        }

        //判断一下玩家输入的位置是否已经存在了相同，如果相同，让玩家重新输入
        if(qipan[row][n].equals(Image1) || qipan[row][n].equals(Image2)){
            System.out.println("兄弟，你在这个位置已经有了棋子了,放不下了，请换个地方摆放~~~");
            showQiPan(qipan);

            begin(qipan,x);
            return;
        }

        if(x==1){
            qipan[row][n]=Image1;
        }

        if(x==2){
            qipan[row][n]=Image2;
        }

        showQiPan(qipan);

        int count=0; //判断棋盘中玩家的数量是否已经铺满了
        for(int i=0;i<qipan.length;i++){
            for(int j=0;j<qipan[i].length;j++){
                if(qipan[i][j].equals(Image1) || qipan[i][j].equals(Image2)){
                    count++;
                }
            }
        }

        if(count >=qipanCount){//如果玩家一和玩家二的棋子都摆满了整个棋盘就返回
            System.out.println("为了棋圣的头衔，最终拼了个你死网破-----【平局】");
            return;
        }else{
            //判断用户下的位置是否赢了
            if(isWin(qipan,row,n,Image1) || isWin(qipan,row,n,Image2)  ){
                System.out.println("棋逢对手，最终还是 "+ x +" 赢了!!!!!!");
                return;
            }else{
                if(x == 1){
                    x=2;
                }else if(x==2){
                    x=1;
                } //游戏开始的时候是玩家一，玩家一下了一步就让切换成玩家二


                begin(qipan,x);
            }
        }
    }

    /**
     * 判断用户下的位置是否已经赢了
     * @param qipan
     * @param row 行
     * @param n  列
     */
    public static Boolean isWin(String[][] qipan,int row,int n,String img){

        //判断当前的左上方
        int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0,flag8=0;
        for(int i=row-1,j=n-1;i>=0 && j>=0;i--,j--){
            if(qipan[i][j].equals(img)){
                flag1++;
            }
        }
        //判断当前的右下方
        for(int i=row+1,j=n+1;i<Rows && j<Lows;i++,j++){
            if(qipan[i][j].equals(img)){
                flag2++;
            }
        }
        //判断当前的右上方
        for(int i=row-1,j=n+1;i>=0 && j<Lows;i--,j++){
            if(qipan[i][j].equals(img)){
                flag3++;
            }
        }
        //判断当前的左下方
        for(int i=row+1,j=n-1;i<Rows && j>=0;i++,j--){
            if(qipan[i][j].equals(img)){
                flag4++;
            }
        }

        //正上方
        for(int i=row-1,j=n;i>=0 && j>=0;i--){
            if(qipan[i][j].equals(img)){
                flag5++;
            }
        }
        //正下方
        for(int i=row+1,j=n;i<Rows && j>=0;i++){
            if(qipan[i][j].equals(img)){
                flag6++;
            }
        }
        //正左方
        for(int i=row,j=n-1;i>=0 && j>=0;j--){
            if(qipan[i][j].equals(img)){
                flag7++;
            }
        }
        for(int i=row,j=n+1;i>=0 && j<Lows;j++){
            if(qipan[i][j].equals(img)){
                flag8++;
            }
        }

        //这个winCount-1，我思想是没算当前下的那个棋子，而是把其他方向的棋子算进去了，比如，当前下的，就计算当前下的棋子的上面，而本身并不算上。
        if(flag1+flag2 >=winCount-1 || flag3+flag4>=winCount-1 || flag5+flag6>=winCount-1 || flag7+flag8>=winCount-1){
            System.out.println("赢了五个连起来了!!！");
            return true;
        }
        return false;
    }
    public static void showQiPan(String[][] qipan){
        for (String[] strings : qipan) {
            for (String string : strings) {
                System.out.print(string);
            }
            System.out.println();
        }
    }
    public static void init(String[][] qipan){
        for (int i = 0; i < qipan.length; i++) {
            for (int i1 = 0; i1 < qipan[i].length; i1++) {
                qipan[i][i1]=" 0 ";
            }
        }
        showQiPan(qipan);
    }
}
